From 6a089816fc41031a94bcae102d5000f14d582cbf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Tue, 15 Sep 2020 06:20:56 +0200 Subject: [PATCH] gsk: Parse radial gradient nodes --- gsk/gskrendernodeparser.c | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index e94034eae1..5520167950 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1012,6 +1012,63 @@ parse_repeating_linear_gradient_node (GtkCssParser *parser) return parse_linear_gradient_node_internal (parser, TRUE); } +static GskRenderNode * +parse_radial_gradient_node_internal (GtkCssParser *parser, + gboolean repeating) +{ + graphene_rect_t bounds = GRAPHENE_RECT_INIT (0, 0, 50, 50); + graphene_point_t center = GRAPHENE_POINT_INIT (25, 25); + double hradius = 25.0; + double vradius = 25.0; + double start = 0.5; + double end = 1.0; + GArray *stops = NULL; + const Declaration declarations[] = { + { "bounds", parse_rect, NULL, &bounds }, + { "center", parse_point, NULL, ¢er }, + { "hradius", parse_double, NULL, &hradius }, + { "vradius", parse_double, NULL, &vradius }, + { "start", parse_double, NULL, &start }, + { "end", parse_double, NULL, &end }, + { "stops", parse_stops, clear_stops, &stops }, + }; + GskRenderNode *result; + + parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); + if (stops == NULL) + { + GskColorStop from = { 0.0, GDK_RGBA("AAFF00") }; + GskColorStop to = { 1.0, GDK_RGBA("FF00CC") }; + + stops = g_array_new (FALSE, FALSE, sizeof (GskColorStop)); + g_array_append_val (stops, from); + g_array_append_val (stops, to); + } + + if (repeating) + result = gsk_repeating_radial_gradient_node_new (&bounds, ¢er, hradius, vradius, start, end, + (GskColorStop *) stops->data, stops->len); + else + result = gsk_radial_gradient_node_new (&bounds, ¢er, hradius, vradius, start, end, + (GskColorStop *) stops->data, stops->len); + + g_array_free (stops, TRUE); + + return result; +} + +static GskRenderNode * +parse_radial_gradient_node (GtkCssParser *parser) +{ + return parse_radial_gradient_node_internal (parser, FALSE); +} + +static GskRenderNode * +parse_repeating_radial_gradient_node (GtkCssParser *parser) +{ + return parse_radial_gradient_node_internal (parser, TRUE); +} + static GskRenderNode * parse_inset_shadow_node (GtkCssParser *parser) { @@ -1535,10 +1592,12 @@ parse_node (GtkCssParser *parser, { "debug", parse_debug_node }, { "inset-shadow", parse_inset_shadow_node }, { "linear-gradient", parse_linear_gradient_node }, + { "radial-gradient", parse_radial_gradient_node }, { "opacity", parse_opacity_node }, { "outset-shadow", parse_outset_shadow_node }, { "repeat", parse_repeat_node }, { "repeating-linear-gradient", parse_repeating_linear_gradient_node }, + { "repeating-radial-gradient", parse_repeating_radial_gradient_node }, { "rounded-clip", parse_rounded_clip_node }, { "shadow", parse_shadow_node }, { "text", parse_text_node }, -- 2.30.2